package 滑动窗口;

/**
 * @PackageName: 滑动窗口
 * @ClassName: LeetCode1004
 * @Author: chen jinxu
 * @Date: 2022/3/20 22:02
 * 最大连续1的个数 III
 * 给定一个二进制数组 nums 和一个整数 k ，如果可以翻转最多k 个 0 ，
 * 则返回 数组中连续 1 的最大个数 。
 * <p>
 * 输入：nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2
 * 1 1 1 0 0 0
 *         0 0 1 1 1 1
 *           0 1 1 1 1 0
 * 输出：6
 * 解释：[1,1,1,0,0,1,1,1,1,1,1]
 * 粗体数字从 0 翻转到 1，最长的子数组长度为 6。
 * <p>
 * 输入：nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
 * 输出：10
 * 解释：[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
 * 粗体数字从 0 翻转到 1，最长的子数组长度为 10
 */
public class LeetCode1004 {
    public static void main(String[] args) {
        int[] nums = {1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0};
        int k = 2;
        int result = longestOnes(nums, k);
        System.out.println(result);
    }

    public static int longestOnes(int[] nums, int k) {
        int n = nums.length;
        if (n == 0) {
            return 0;
        }
        int result = 0;
        int left = 0;
        int right = 0;
        int count0 = 0;
        while (right < n) {
            if (nums[right] == 0) {
                count0++;
            }
            while (count0 > k) {
                if (nums[left++] == 0) {
                    count0--;
                }
            }
            result = Math.max(result, right - left + 1);
            right++;
        }
        return result;
    }
}
